﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class ReciboServicio : IReciboServicio
    {
        public IList<ReciboServicioInfo> Listar(ReciboServicioInfo oRecibo)
        {
            var sqlParm = new SqlParameter[7];
            var oListaRecibos = new List<ReciboServicioInfo>();

            sqlParm[0] = new SqlParameter("@Nro_Recibo", SqlDbType.VarChar);
            if (oRecibo.NroRecibo != null)
                sqlParm[0].Value = oRecibo.NroRecibo;
            else
                sqlParm[0].Value = DBNull.Value;

            sqlParm[1] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
            if (oRecibo.RucProveedor != null)
                sqlParm[1].Value = oRecibo.RucProveedor;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Fecha_Recibo_Desde", SqlDbType.DateTime);
            if (oRecibo.FechaReciboDesde.HasValue)
                sqlParm[2].Value = oRecibo.FechaReciboDesde;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Fecha_Recibo_Hasta", SqlDbType.DateTime);
            if (oRecibo.FechaReciboHasta.HasValue)
                sqlParm[3].Value = oRecibo.FechaReciboHasta;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Fecha_Vencimiento_Desde", SqlDbType.DateTime);
            if (oRecibo.FechaVencimientoDesde.HasValue)
                sqlParm[4].Value = oRecibo.FechaVencimientoDesde;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Fecha_Vencimiento_Hasta", SqlDbType.DateTime);
            if (oRecibo.FechaVencimientoHasta.HasValue)
                sqlParm[5].Value = oRecibo.FechaVencimientoHasta;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
            if (oRecibo.IdLocal != null)
                sqlParm[6].Value = oRecibo.IdLocal;
            else
                sqlParm[6].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_RECIBO_SERVICIO", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaRecibos.Add(new ReciboServicioInfo(drd.GetString(0).Trim(),
                                drd.GetString(1).Trim(), new ProveedorInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim()),
                                drd.GetDateTime(3), drd.GetDateTime(4), drd.GetDateTime(5), drd.GetString(6).Trim(),
                                Double.Parse(drd.GetValue(7).ToString()), Double.Parse(drd.GetValue(8).ToString()), Double.Parse(drd.GetValue(9).ToString()),
                                Double.Parse(drd.GetValue(10).ToString()), drd.GetString(11).Trim(), drd.GetString(12).Trim(), drd.GetString(13).Trim(),
                                drd.IsDBNull(14) ? (DateTime?)null : drd.GetDateTime(14), Double.Parse(drd.GetValue(15).ToString()), drd.GetString(16).Trim(),
                                drd.GetString(17).Trim(), drd.GetString(18).Trim(), new TipoServicioInfo(drd.GetString(18).Trim(), drd.GetString(19).Trim()),
                                drd.GetString(20).Trim(), new LocalInfo(drd.GetString(20).Trim(), drd.GetString(21).Trim(), null)
                                ));
                        }
                    }
                }
            }
            return oListaRecibos;
        }

        public ReciboServicioInfo Consultar(ReciboServicioInfo oRecibo)
        {
            var sqlParm = new SqlParameter[7];
            var oEntRecibo = new ReciboServicioInfo();

            sqlParm[0] = new SqlParameter("@Nro_Recibo", SqlDbType.VarChar);
            if (oRecibo.NroRecibo != null)
                sqlParm[0].Value = oRecibo.NroRecibo;
            else
                sqlParm[0].Value = DBNull.Value;

            sqlParm[1] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
            if (oRecibo.RucProveedor != null)
                sqlParm[1].Value = oRecibo.RucProveedor;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Fecha_Recibo_Desde", SqlDbType.DateTime);
            if (oRecibo.FechaReciboDesde.HasValue)
                sqlParm[2].Value = oRecibo.FechaReciboDesde;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Fecha_Recibo_Hasta", SqlDbType.DateTime);
            if (oRecibo.FechaReciboHasta.HasValue)
                sqlParm[3].Value = oRecibo.FechaReciboHasta;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Fecha_Vencimiento_Desde", SqlDbType.DateTime);
            if (oRecibo.FechaVencimientoDesde.HasValue)
                sqlParm[4].Value = oRecibo.FechaVencimientoDesde;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Fecha_Vencimiento_Hasta", SqlDbType.DateTime);
            if (oRecibo.FechaVencimientoHasta.HasValue)
                sqlParm[5].Value = oRecibo.FechaVencimientoHasta;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
            if (oRecibo.IdLocal != null)
                sqlParm[6].Value = oRecibo.IdLocal;
            else
                sqlParm[6].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_RECIBO_SERVICIO", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();
                        oEntRecibo = new ReciboServicioInfo(drd.GetString(0).Trim(),
                                drd.GetString(1).Trim(), new ProveedorInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim()),
                                drd.GetDateTime(3), drd.GetDateTime(4), drd.GetDateTime(5), drd.GetString(6).Trim(),
                                Double.Parse(drd.GetValue(7).ToString()), Double.Parse(drd.GetValue(8).ToString()), Double.Parse(drd.GetValue(9).ToString()),
                                Double.Parse(drd.GetValue(10).ToString()), drd.GetString(11).Trim(), drd.GetString(12).Trim(), drd.GetString(13).Trim(),
                                drd.IsDBNull(14) ? (DateTime?)null : drd.GetDateTime(14), Double.Parse(drd.GetValue(15).ToString()), drd.GetString(16).Trim(),
                                drd.GetString(17).Trim(), drd.GetString(18).Trim(), new TipoServicioInfo(drd.GetString(18).Trim(), drd.GetString(19).Trim()),
                                drd.GetString(20).Trim(), new LocalInfo(drd.GetString(20).Trim(), drd.GetString(21).Trim(), null)
                                );
                    }

                }
            }
            return oEntRecibo;
        }

        public bool Registrar(ReciboServicioInfo oRecibo)
        {
            var sqlParm = new SqlParameter[19];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Nro_Recibo", SqlDbType.VarChar);
                    if (oRecibo.NroRecibo != null)
                        sqlParm[0].Value = oRecibo.NroRecibo;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
                    if (oRecibo.RucProveedor != null)
                        sqlParm[1].Value = oRecibo.RucProveedor;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Fecha_Recibo", SqlDbType.DateTime);
                    if (oRecibo.FechaRecibo.HasValue)
                        sqlParm[2].Value = oRecibo.FechaRecibo;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Fecha_Vencimiento", SqlDbType.DateTime);
                    if (oRecibo.FechaVencimiento.HasValue)
                        sqlParm[3].Value = oRecibo.FechaVencimiento;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Fecha_Recepcion", SqlDbType.DateTime);
                    if (oRecibo.FechaRecepcion.HasValue)
                        sqlParm[4].Value = oRecibo.FechaRecepcion;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@SubTotal", SqlDbType.Decimal);
                    if (oRecibo.SubTotal.HasValue)
                        sqlParm[5].Value = oRecibo.SubTotal;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Igv", SqlDbType.Decimal);
                    if (oRecibo.Igv.HasValue)
                        sqlParm[6].Value = oRecibo.Igv;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Total", SqlDbType.Decimal);
                    if (oRecibo.Total.HasValue)
                        sqlParm[7].Value = oRecibo.Total;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Retenciones", SqlDbType.Decimal);
                    if (oRecibo.Retenciones.HasValue)
                        sqlParm[8].Value = oRecibo.Retenciones;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oRecibo.Observaciones != null)
                        sqlParm[9].Value = oRecibo.Observaciones;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Asiento_Exactus", SqlDbType.VarChar);
                    if (oRecibo.AsientoExactus != null)
                        sqlParm[10].Value = oRecibo.AsientoExactus;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    sqlParm[11] = new SqlParameter("@Id_Moneda", SqlDbType.VarChar);
                    if (oRecibo.IdMoneda != null)
                        sqlParm[11].Value = oRecibo.IdMoneda;
                    else
                        sqlParm[11].Value = DBNull.Value;

                    sqlParm[12] = new SqlParameter("@Pagado_Por", SqlDbType.VarChar);
                    if (oRecibo.PagadoPor != null)
                        sqlParm[12].Value = oRecibo.PagadoPor;
                    else
                        sqlParm[12].Value = DBNull.Value;

                    sqlParm[13] = new SqlParameter("@Nro_Pago", SqlDbType.VarChar);
                    if (oRecibo.NroPago != null)
                        sqlParm[13].Value = oRecibo.NroPago;
                    else
                        sqlParm[13].Value = DBNull.Value;

                    sqlParm[14] = new SqlParameter("@Monto_Pago", SqlDbType.Decimal);
                    if (oRecibo.MontoPago.HasValue)
                        sqlParm[14].Value = oRecibo.MontoPago;
                    else
                        sqlParm[14].Value = DBNull.Value;

                    sqlParm[15] = new SqlParameter("@Fecha_Pago", SqlDbType.DateTime);
                    if (oRecibo.FechaPago.HasValue)
                        sqlParm[15].Value = oRecibo.FechaPago;
                    else
                        sqlParm[15].Value = DBNull.Value;

                    sqlParm[16] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oRecibo.IdUsuarioSistema != null)
                        sqlParm[16].Value = oRecibo.IdUsuarioSistema;
                    else
                        sqlParm[16].Value = DBNull.Value;

                    sqlParm[17] = new SqlParameter("@Id_Tipo_Servicio", SqlDbType.VarChar);
                    if (oRecibo.IdTipoServicio != null)
                        sqlParm[17].Value = oRecibo.IdTipoServicio;
                    else
                        sqlParm[17].Value = DBNull.Value;

                    sqlParm[18] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
                    if (oRecibo.IdLocal != null)
                        sqlParm[18].Value = oRecibo.IdLocal;
                    else
                        sqlParm[18].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_RECIBO_SERVICIO", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        public bool Actualizar(ReciboServicioInfo oRecibo)
        {
            var sqlParm = new SqlParameter[19];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Nro_Recibo", SqlDbType.VarChar);
                    if (oRecibo.NroRecibo != null)
                        sqlParm[0].Value = oRecibo.NroRecibo;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Ruc_Proveedor", SqlDbType.VarChar);
                    if (oRecibo.RucProveedor != null)
                        sqlParm[1].Value = oRecibo.RucProveedor;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Fecha_Recibo", SqlDbType.DateTime);
                    if (oRecibo.FechaRecibo.HasValue)
                        sqlParm[2].Value = oRecibo.FechaRecibo;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Fecha_Vencimiento", SqlDbType.DateTime);
                    if (oRecibo.FechaVencimiento.HasValue)
                        sqlParm[3].Value = oRecibo.FechaVencimiento;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Fecha_Recepcion", SqlDbType.DateTime);
                    if (oRecibo.FechaRecepcion.HasValue)
                        sqlParm[4].Value = oRecibo.FechaRecepcion;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@SubTotal", SqlDbType.Decimal);
                    if (oRecibo.SubTotal.HasValue)
                        sqlParm[5].Value = oRecibo.SubTotal;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Igv", SqlDbType.Decimal);
                    if (oRecibo.Igv.HasValue)
                        sqlParm[6].Value = oRecibo.Igv;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Total", SqlDbType.Decimal);
                    if (oRecibo.Total.HasValue)
                        sqlParm[7].Value = oRecibo.Total;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Retenciones", SqlDbType.Decimal);
                    if (oRecibo.Retenciones.HasValue)
                        sqlParm[8].Value = oRecibo.Retenciones;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oRecibo.Observaciones != null)
                        sqlParm[9].Value = oRecibo.Observaciones;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Asiento_Exactus", SqlDbType.VarChar);
                    if (oRecibo.AsientoExactus != null)
                        sqlParm[10].Value = oRecibo.AsientoExactus;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    sqlParm[11] = new SqlParameter("@Id_Moneda", SqlDbType.VarChar);
                    if (oRecibo.IdMoneda != null)
                        sqlParm[11].Value = oRecibo.IdMoneda;
                    else
                        sqlParm[11].Value = DBNull.Value;

                    sqlParm[12] = new SqlParameter("@Pagado_Por", SqlDbType.VarChar);
                    if (oRecibo.PagadoPor != null)
                        sqlParm[12].Value = oRecibo.PagadoPor;
                    else
                        sqlParm[12].Value = DBNull.Value;

                    sqlParm[13] = new SqlParameter("@Nro_Pago", SqlDbType.VarChar);
                    if (oRecibo.NroPago != null)
                        sqlParm[13].Value = oRecibo.NroPago;
                    else
                        sqlParm[13].Value = DBNull.Value;

                    sqlParm[14] = new SqlParameter("@Monto_Pago", SqlDbType.Decimal);
                    if (oRecibo.MontoPago.HasValue)
                        sqlParm[14].Value = oRecibo.MontoPago;
                    else
                        sqlParm[14].Value = DBNull.Value;

                    sqlParm[15] = new SqlParameter("@Fecha_Pago", SqlDbType.DateTime);
                    if (oRecibo.FechaPago.HasValue)
                        sqlParm[15].Value = oRecibo.FechaPago;
                    else
                        sqlParm[15].Value = DBNull.Value;

                    sqlParm[16] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oRecibo.IdUsuarioSistema != null)
                        sqlParm[16].Value = oRecibo.IdUsuarioSistema;
                    else
                        sqlParm[16].Value = DBNull.Value;

                    sqlParm[17] = new SqlParameter("@Id_Tipo_Servicio", SqlDbType.VarChar);
                    if (oRecibo.IdTipoServicio != null)
                        sqlParm[17].Value = oRecibo.IdTipoServicio;
                    else
                        sqlParm[17].Value = DBNull.Value;

                    sqlParm[18] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
                    if (oRecibo.IdLocal != null)
                        sqlParm[18].Value = oRecibo.IdLocal;
                    else
                        sqlParm[18].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_RECIBO_SERVICIO", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }
    }
}
